#include <bits/stdc++.h>
using namespace std;
int n, L;
const int maxn = 1e5+200, maxm = 1000+10;
int idx[maxn];

struct SuffixArray {
    int s[maxn];      // 原始字符数组（最后一个字符应必须是0，而前面的字符必须非0）
    int sa[maxn];     // 后缀数组
    int rk[maxn];   // 名次数组. rk[0]一定是n-1，即最后一个字符
    int he[maxn]; // height数组
    int x[maxn], y[maxn], c[maxn]; // 辅助数组
    int L; // 字符个数

    void clear() { L = 0; memset(sa, 0, sizeof(sa)); }

    // m为最大字符值加1。调用之前需设置好s和n
    void build_sa(int m) {
        register int i;
        for(i = 0; i < m; i++) c[i] = 0;
        for(i = 0; i < L; i++) c[x[i] = s[i]]++;
        for(i = 1; i < m; i++) c[i] += c[i-1];
        for(i = L-1; i >= 0; i--) sa[--c[x[i]]] = i;
        for(int k = 1; k <= L; k <<= 1) {
            int p = 0;
            for(i = L-k; i < L; i++) y[p++] = i;
            for(i = 0; i < L; i++) if(sa[i] >= k) y[p++] = sa[i]-k;
            for(i = 0; i < m; i++) c[i] = 0;
            for(i = 0; i < L; i++) c[x[y[i]]]++;
            for(i = 0; i < m; i++) c[i] += c[i-1];
            for(i = L-1; i >= 0; i--) sa[--c[x[y[i]]]] = y[i];
            swap(x, y);
            p = 1; x[sa[0]] = 0;
            for(i = 1; i < L; i++)
                x[sa[i]] = y[sa[i-1]]==y[sa[i]] && y[sa[i-1]+k]==y[sa[i]+k] ? p-1 : p++;
            if(p >= L) break;
            m = p;
        }
    }

    void build_height() {
        int i, k = 0;
        for(i = 0; i < L; i++) rk[sa[i]] = i;
        for(i = 0; i < L; i++) {
            if(k) k--;
            int j = sa[rk[i]-1];
            while(s[i+k] == s[j+k]) k++;
            he[rk[i]] = k;
        }
    }
}sa;

bool good(int l, int r){
    if(r-l<n/2) return false;
    bool flg[maxn]; memset(flg, false, sizeof flg);
    int t = 0;
    for (int i = l; i < r ; ++i) {
        int id = idx[sa.sa[i]];
        if(!flg[id] && id!=n) flg[id] = true, ++t;
    }
    return t>n/2;
}

int ansl, str[maxm], cnt, ansc;
bool can(int len){
    cnt = 0;
    int l = 0;
    for (int r = 1; r <= sa.L; ++r) {
        if(sa.he[r]<len || r==sa.L){
            if(good(l, r))
                str[cnt++] = sa.sa[l];
            l = r;
        }
    }
    if(cnt) ansl = len, ansc = cnt;
    return cnt;
}


bool bi(int maxl){
    if(!can(1)) return false;
    int l=1, r = maxl;
    bool flg = false;
    while (l <= r){
        int m = l+(r-l)/2;
        if(can(m)) flg = true, l = m+1;
        else r = m-1;
    }
    return flg;
}

void add(int ch, int id){
    idx[sa.L] = id;
    sa.s[sa.L++] = ch;
}

int main() {
    bool fir = true;
    while (scanf("%d", &n)==1 && n){
        if(fir) fir = false; else putchar('\n');
        sa.clear();
        char t[maxm];
        int maxl = 0;
        for (int i = 0; i < n; ++i) {
            scanf("%s", t);
            int l = strlen(t);
            maxl = l>maxl? l:maxl;
            for (int j = 0; j < l; ++j) {
                add(t[j]-'a'+1, i);
            }
            add(100+i, n);
        }
        add(0, n);

        if(n==1){printf("%s\n", t); continue;}
        sa.build_sa(100+n);
        sa.build_height();
        if(!bi(maxl)) {printf("?\n"); continue;}
        for (int i = 0; i < ansc; ++i) {
            for (int j = 0; j < ansl; ++j) {
                int st = str[i];
                putchar(sa.s[j+st]+'a'-1);
            }
            putchar('\n');
        }
    }
    return 0;
}